package com.cykj.service.Impl;

import com.cykj.dto.ConsultantDTO;
import com.cykj.dto.ResponseDto;
import com.cykj.mapper.ConsultantMapper;
import com.cykj.pojo.PsAppointmentRecord;
import com.cykj.pojo.PsConsultant;
import com.cykj.pojo.PsConsultingRecord;
import com.cykj.service.ConsultantService;
import com.cykj.vo.BookingVo;
import com.cykj.vo.SelectMoneyVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @BelongsProject: Psychology
 * @BelongsPackage: com.cykj.service.Impl
 * @Author: 小林
 * @CreateTime: 2025-02-04 11:08
 * @Description: 咨询师service层，处理与咨询师相关的业务逻辑
 * @Version: 1.0
 */
@Service
public class ConsultantServiceImpl implements ConsultantService {

    // 注入咨询师数据访问层的Mapper
    @Autowired
    private ConsultantMapper consultantMapper;

    /**
     * 查询咨询师金额
     *
     * @param vo 包含分页信息的查询对象，用于指定查询的页码和每页记录数
     * @return 封装查询结果的响应对象，成功时包含分页信息，失败时提示查询有误
     */
    @Override
    public ResponseDto selctMoney(SelectMoneyVo vo) {
        // 开启分页查询，设置当前页码和每页记录数
        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
        // 调用Mapper层方法查询咨询师金额信息
        List<PsConsultant> psConsultants = consultantMapper.selectConsultantMoney(vo);
        // 封装分页信息
        PageInfo<PsConsultant> pageInfo = new PageInfo<>(psConsultants);
        // 根据查询结果返回成功或失败的响应
        return pageInfo != null ? ResponseDto.success(pageInfo) : ResponseDto.error("查询有误！");
    }

    /**
     * 后台预约列表显示（咨询记录表、用户表、领域表）
     *
     * @param vo 包含分页信息的查询对象，用于指定查询的页码和每页记录数
     * @return 封装查询结果的响应对象，成功时包含分页信息，失败时提示查询有误
     */
    @Override
    public ResponseDto getConsultantAndUserAndType(BookingVo vo) {
        // 开启分页查询，设置当前页码和每页记录数
        PageHelper.startPage(vo.getPageNum(), vo.getPageSize());
        // 调用Mapper层方法查询咨询师、用户和领域相关信息
        List<PsConsultant> consultantAndUserAndType = consultantMapper.getConsultantAndUserAndType(vo);
        // 封装分页信息
        PageInfo<PsConsultant> pageInfo = new PageInfo<>(consultantAndUserAndType);
        // 根据查询结果返回成功或失败的响应
        return pageInfo != null ? ResponseDto.success(pageInfo) : ResponseDto.error("查询有误！");
    }

    /**
     * 修改预约回复信息
     *
     * @param vo 包含要修改的预约回复信息的对象
     * @return 封装操作结果的响应对象，成功时提示修改成功，失败时提示修改有误
     */
    @Override
    public ResponseDto updateAppointmentReply(BookingVo vo) {
        // 调用Mapper层方法修改预约回复信息
        int i = consultantMapper.updateAppointmentReply(vo);
        // 根据修改结果返回成功或失败的响应
        if (i > 0) {
            return ResponseDto.success("修改成功！");
        }
        return ResponseDto.error("修改有误！");
    }

    /**
     * 修改预约状态为2
     *
     * @param vo 包含要修改的预约信息的对象
     * @return 封装操作结果的响应对象，成功时提示修改成功，失败时提示修改有误
     */
    @Override
    public ResponseDto updateAppointmentStatus2(BookingVo vo) {
        // 调用Mapper层方法修改预约状态
        int i = consultantMapper.updateAppointmentStatus2(vo);
        // 根据修改结果返回成功或失败的响应
        if (i > 0) {
            return ResponseDto.success("修改成功！");
        }
        return ResponseDto.error("修改有误！");
    }

    /**
     * 修改预约状态为3
     *
     * @param vo 包含要修改的预约信息的对象
     * @return 封装操作结果的响应对象，成功时提示修改成功，失败时提示修改有误
     */
    @Override
    public ResponseDto updateAppointmentStatus3(BookingVo vo) {
        // 调用Mapper层方法修改预约状态
        int i = consultantMapper.updateAppointmentStatus3(vo);
        // 根据修改结果返回成功或失败的响应
        if (i > 0) {
            return ResponseDto.success("修改成功！");
        }
        return ResponseDto.error("修改有误！");
    }

    /**
     * 修改预约状态为4
     *
     * @param vo 包含要修改的预约信息的对象
     * @return 封装操作结果的响应对象，成功时提示修改成功，失败时提示修改有误
     */
    @Override
    public ResponseDto updateAppointmentStatus4(BookingVo vo) {
        // 调用Mapper层方法修改预约状态
        int i = consultantMapper.updateAppointmentStatus4(vo);
        // 根据修改结果返回成功或失败的响应
        if (i > 0) {
            return ResponseDto.success("修改成功！");
        }
        return ResponseDto.error("修改有误！");
    }

    /**
     * 修改预约状态为5
     *
     * @param vo 包含要修改的预约信息的对象
     * @return 封装操作结果的响应对象，成功时提示修改成功，失败时提示修改有误
     */
    @Override
    public ResponseDto updateAppointmentStatus5(BookingVo vo) {
        // 调用Mapper层方法修改预约状态
        int i = consultantMapper.updateAppointmentStatus5(vo);
        // 根据修改结果返回成功或失败的响应
        if (i > 0) {
            return ResponseDto.success("修改成功！");
        }
        return ResponseDto.error("修改有误！");
    }

    /**
     * 修改预约状态为6
     *
     * @param vo 包含要修改的预约信息的对象
     * @return 封装操作结果的响应对象，成功时提示修改成功，失败时提示修改有误
     */
    @Override
    public ResponseDto updateAppointmentStatus6(BookingVo vo) {
        // 调用Mapper层方法修改预约状态
        int i = consultantMapper.updateAppointmentStatus6(vo);
        // 根据修改结果返回成功或失败的响应
        if (i > 0) {
            return ResponseDto.success("修改成功！");
        }
        return ResponseDto.error("修改有误！");
    }

    /**
     * 根据咨询师ID查询咨询师金额
     *
     * @param adminId 咨询师ID
     * @return 封装查询结果的响应对象，成功时包含咨询师金额信息，失败时提示查询有误
     */
    @Override
    public ResponseDto getMoney(Integer adminId) {
        // 调用Mapper层方法查询咨询师金额
        PsConsultant money = consultantMapper.getMoney(adminId);
        // 根据查询结果返回成功或失败的响应
        return money != null ? ResponseDto.success(money) : ResponseDto.error("查询有误！");
    }

    /**
     * 根据时间范围查询带预约信息的咨询师列表，并计算总预约量
     *
     * @param vo 包含时间范围和分页信息的查询对象
     * @return 封装查询结果的响应对象，包含咨询师列表和总预约量，失败时提示查询失败及错误信息
     */
    @Override
    public ResponseDto getConsultantsWithAppointmentsByTimeRange(BookingVo vo) {
        try {
            // 调用Mapper层方法查询带预约信息的咨询师列表
            List<PsConsultant> consultants = consultantMapper.getConsultantsWithAppointmentsByTimeRange(vo);

            // 计算总预约量
            int totalAppointments = 0;
            List<ConsultantDTO> result = new ArrayList<>();

            for (PsConsultant consultant : consultants) {
                totalAppointments += consultant.getAppointmentCount();
                result.add(new ConsultantDTO(
                        consultant.getConsultantName(),
                        consultant.getAppointmentCount()
                ));
            }

            // 封装返回数据，包含咨询师列表和总预约量
            Map<String, Object> responseData = new HashMap<>();
            responseData.put("consultants", result);
            responseData.put("totalAppointments", totalAppointments);

            return ResponseDto.success(responseData);
        } catch (Exception e) {
            // 捕获异常并返回失败响应，包含错误信息
            return ResponseDto.error("查询失败：" + e.getMessage());
        }
    }
}